package io;

import java.io.*;
import java.util.Scanner;


/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: 言初
 * Date: 2024-01-13
 * Time: 19:42
 */
public class ioDemo9 {
    // 文件操作的案例3：
    // 扫描指定的目录，并找到名称或者内容中包含指定字符的所有普通文件（不包含目录）
    // 实现过程：
    // 1.先去递归的遍历目录，比如给定一个 d:/ 去递归的把这里包含的所有文件都列出来。
    // 2.每次找到一个文件，就把这个文件打开，并读取文件内容（得到String）
    // 3.再判定要查询的词 是否再上述文件内容中存在，如果存在，结果即为所求。
    public static void main(String[] args) throws IOException {
        // 先让用户输入一个根目录，从这个根目录来往下找文件
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入要查找的根目录：");
        // 这里的目录输入格式：   e:/test/      也可以是更深层次的目录 : e:/Users/言初/AppData/     也可以是 e:/
        File file = new File(sc.next());

        // 判断一下这个输入的根目录是不是一个目录，如果不是目录就代表输入有误
        if(!file.isDirectory()){
            // 不是一个目录，输入有误
            System.out.println("输入有误，输入内容不是一个目录");
        }else{
            // 输入需要查找的词
            System.out.println("请输入需要查找的词：");
            String str= sc.next();

            //调用函数来完成对文件的递归操作
            scanfile(file,str);
        }

    }

    private static void scanfile(File file, String str) throws IOException {
        // 递归的来完成根目录下所有文件的遍历和判断

        // 当遍历到根目录里面的内容为空的时候，就是递归的结束条件了
        if(file==null){
            // 空的目录
            return;
        }

        // 目录里面有内容，就遍历得到这个目录里面的所有文件，并判断其文件内容中是否包含所要查找的字符串
        File[] files=file.listFiles();
        int len=files.length;
        for(File file1 : files){

            //读出这个文件中的内容，然后判断内容中是否包含所要查找的字符串

            if(file1.isFile()){

                // 为了方便观察过程，所以在这里打印看一下
                System.out.println("当前搜索的是  "+file1.getAbsolutePath());

                // file1是一个文件，就可以直接读出它的内容然后进行判断了
                String string = readFile(file1);//readFile方法负责读出一个文件中的所有内容，并返回
                //判断这个打开的文件的内容 是否包含所要查找的字符串
                if(string.contains(str)){
                    System.out.println(file1+"  包含所查找的内容");
                }
            }else if (file1.isDirectory()){
                //file1是一个目录的话，就需要继续进行递归，找到它包含的文件
                scanfile(file1,str);
            }else{
                //不是目录，也不是文件
                continue;
            }

        }
    }

    private static String readFile(File file) throws IOException {
        //负责读出一个文件中的所有内容，并返回
        StringBuilder stringBuilder = new StringBuilder();
        // 使用字符流进行读取，所以使用的是 Reader 类,
        try(Reader reader= new FileReader(file)){
            while(true){
                int c = reader.read();
                if(c==-1){
                    break;
                }
                stringBuilder.append((char)c);
            }
        }

        return stringBuilder.toString();
    }
}
